package com.kaguya.decorator;

/**
 * 结构型：装饰者模式：
 * 对原本的类进行装饰，在不改变原有类结构的情况下 使用装饰类来方便得做扩展装饰功能
 * 与代理模式有些许类似，和代理模式的区别：
 * 1）、代理模式偏向于对原有类行为的增强，装饰者模式偏向于增强类的能力。
 * 2）、spring aop使用代理模式，FileInputStream就是InputStream的装饰者类。
 * 3）、代理模式是行为的扩展，装饰者模式是对对象的扩展。
 * 4）、例如想要拧开罐头，代理模式是把拧开罐头这个行为交给别人帮忙实现，
 *      而装饰者模式可能就是对这个罐头盖装了个拉环，让它更容易被打开。
 */
public class Decorator {

    public static void main(String[] args) {
        // 提出需求：为了防止手机摔落造成外观损坏，套一个手机壳起到保护作用
        Phone myPhone = new MobilePhone();

        MobliePhoneShell newShell = new MobliePhoneShell(myPhone);

        newShell.call();
        newShell.protectedPhone();
    }
}

/**
 * 手机接口
 */
interface Phone {
    void call();
}
/**
 * 手机壳
 */
class PhoneShell implements Phone{
    private Phone phone;

    public PhoneShell(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void call() {
        phone.call();
    }
}
/**
 * 手机实现
 */
class MobilePhone implements Phone {

    @Override
    public void call() {
        System.out.println("calling...");
    }
}
/**
 * 手机壳实现
 */
class MobliePhoneShell extends PhoneShell {

    public MobliePhoneShell(Phone phone) {
        super(phone);
    }

    /**
     * 对手机装饰，不改变手机结构的情况下增加了保护的功能
     */
    public void protectedPhone() {
        System.out.println("this phone has been protected");
    }
}

